#include "socket.h"


//初始化TCP服务器套接字
//创建、绑定并监听指定IP地址和端口的套接字
int socket_init(const char *ipaddr, const char *port)
{
    int s_fd = -1;  //服务器套接字描述符
    int ret = -1;   //函数调用返回值
    struct sockaddr_in s_addr;  //服务器地址信息结构体

    memset(&s_addr,0,sizeof(struct sockaddr_in));   //清空地址结构体

    //1. socket创建TCP套接字
    s_fd = socket(AF_INET, SOCK_STREAM, 0);
    if(s_fd == -1){
        perror("socket");   //打印错误信息
        return -1;  //创建失败返回-1
    }
    
    //设置地址族、端口和IP地址
    s_addr.sin_family = AF_INET;    //IPv4协议族
    s_addr.sin_port = htons(atoi(port));    //将端口号转换为网络字节序
    inet_aton(ipaddr,&s_addr.sin_addr);  //将IP地址字符串 转换为 网络地址结构

    //2. bind 绑定套接字到指定地址和端口
    ret = bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
    if(-1 == ret){  
        perror("bind"); //打印错误信息
        return -1;  //绑定失败返回-1
    }

    //3.listen  开始监听连接请求
    ret = listen(s_fd,1); //只监听1个连接,(队列长度为1)
    if (-1 == ret)
    {
        perror("listen");   //打印错误信息
        return -1;          //监听失败返回-1
    }

    return s_fd;    //返回初始化成功的套接字描述符
}